package com.xiehua.task.monitor.dingding;

import com.xiehua.task.monitor.Statistics;
import com.xiehua.task.prop.XiehuaConfig;
import com.xiehua.task.utils.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.time.LocalDateTime;
import java.util.Map;

import static com.xiehua.task.monitor.Statistics.EMAIL_TYPE_COUNTING;
import static com.xiehua.task.monitor.Statistics.EMAIL_TYPE_EXCETPION;
import static com.xiehua.task.prop.XiehuaConfig.SERVER_DINGDING_ROBOT;

public class Robot {

    private static final Logger LOGGER = LoggerFactory.getLogger(Robot.class);

    public void talk(Statistics statistics) {
        Map<String, String> configMap = XiehuaConfig.getInstance();
        String url = configMap.get(SERVER_DINGDING_ROBOT);
        if (StringUtils.isEmpty(url)) {
            LOGGER.warn("钉钉机器人没有配置");
            return;
        }
        String content = "";
        if (EMAIL_TYPE_COUNTING.equals(statistics.getType())) {
           content = "携华 task server 运行统计\r\n" +
                   "开始时间: "+ LocalDateTime.now().minusHours(1)+",结束时间:"+ LocalDateTime.now()+"\r\n" +
                   "任务线程状态: RUNNIN \r\n" +
                   //"调度成功任务:"+statistics.getTaskSuccess()+"个\r\n" +
                   //"调度失败任务:"+statistics.getTaskFail()+"个\r\n" +
                   "客户端:"+statistics.getTopic()+"调度成功:"+statistics.getSelfSuccess()+"个,调度失败:"+statistics.getSelfFail()+"个";
        }
        if (EMAIL_TYPE_EXCETPION.equals(statistics.getType())) {
            content = "携华 task server 运行发生异常\r\n" +
                    " 堆栈信息如下:\r\n" + ExceptionUtils.getStackTrace(statistics.getException());
        }
        String param = "{\"msgtype\":\"text\",\"text\":{\"content\":\""+content+"\"}}";
        sendPost(url, param);
    }

    /**
     * 向指定URL发送POST请求
     *
     * @param url
     * @param param
     * @return 响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36");
            conn.setRequestProperty("charset", "UTF-8");
            conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 设置请求属性
//            String param = "";
//            if (paramMap != null && paramMap.size() > 0) {
//                Iterator<String> ite = paramMap.keySet().iterator();
//                while (ite.hasNext()) {
//                    String key = ite.next();// key
//                    String value = paramMap.get(key);
//                    param += key + "=" + value + "&";
//                }
//                param = param.substring(0, param.length() - 1);
//            }

            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            LOGGER.error("发送 POST 请求出现异常！" + e);
        } finally {//// 使用finally块来关闭输出流、输入流
            try {
                if (out != null) out.close();
                if (in != null) in.close();
            } catch (IOException ex) {
                LOGGER.error("post资源释放异常！" + ex);
            }
        }
        return result;
    }


}
